#ifndef _queue_h_INCLUDED
#define _queue_h_INCLUDED

#define DISCONNECT UINT_MAX
#define DISCONNECTED(IDX) ((int)(IDX) < 0)

struct kissat;

typedef struct links links;
typedef struct queue queue;

struct links
{
	unsigned prev, next;
	unsigned stamp;
};

struct queue
{
	unsigned first, last, stamp;
	struct
	{
		unsigned idx, stamp;
	} search;
};

void
kissat_mab_init_queue(queue*);
void
kissat_mab_enqueue(struct kissat*, unsigned idx);
void
kissat_mab_dequeue(struct kissat*, unsigned idx);
void
kissat_mab_move_to_front(struct kissat*, unsigned idx);

#define LINK(IDX) (solver->links[assert((IDX) < VARS), (IDX)])

#endif
